#pragma once
#include <iostream>

using namespace std ;

// 日期类的声明

class Date
{

    // 成员属性(私有)

    private:

        int Year ;

        int Month ;

        int Day ;

    // 成员函数(公有)

    public:

        // 构建友元函数声明

        friend ostream& operator<< (ostream& out , const Date& date) ;

        friend istream& operator>> (istream& in , Date& date) ;
    
        // 构建显式构造函数

        Date (int _year = 1 , int _month = 1 , int _day = 1) ;
        
        // 构建显示拷贝构造函数
        
        Date (const Date& date) ; // 这里要用引用,不然会在语法逻辑上无穷递归

        // 析构函数

        ~Date () ;

        // 只要不改变调用对象的都建议加const

        int GetMonthDay (const int& year , const int& month) const ;

        Date& operator+= (const int& day) ;

        Date& operator-= (const int& day) ;

        // 为了减少拷贝,尽量使用函数复用,减少临时变量的拷贝

        Date operator + (const int& day) const ;

        Date operator - (const int& day) const ;

        // 日期 - 日期  难

        int operator- (const Date& date) const ;

        // ++date -> operator++ () ;

        Date& operator++ () ;

        // date++ -> operator++ (int) ; 这里的语法规定,后置加加必须要在括号里面加int作识别(纯规定,你杠就是你对)

        Date operator++ (int) ;

        // --date -> operator-- () ;

        Date& operator-- () ;

        // date++ -> operator-- (int)

        Date operator-- (int) ;

        // 判断操作符重载

        bool operator== (const Date& date) const ;

        bool operator!= (const Date& date) const ;

        bool operator> (const Date& date) const ;

        bool operator>= (const Date& date) const ;

        bool operator< (const Date& date) const ;

        bool operator<= (const Date& date) const ;

        // 检查是否是同一天数

        bool CheckDate () ;

        // 打印

        void Print () const ;
        
} ;

ostream& operator<< (ostream& out , const Date& date) ;

istream& operator>> (istream& in , Date& date) ;